package com.xhj.mybatis.plugin;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Invocation
 *
 * @author XJks
 * @description Invocation类用于封装一次方法调用的信息，包括目标对象、方法和参数。
 */
public class Invocation {

    /**
     * 目标对象，即要调用方法的对象实例
     */
    private final Object target;

    /**
     * 要调用的方法对象（反射机制中的Method类）
     */
    private final Method method;

    /**
     * 方法调用时传递的参数列表
     */
    private final Object[] args;

    /**
     * 构造方法，初始化Invocation对象
     *
     * @param target 目标对象
     * @param method 要调用的方法
     * @param args   方法参数
     */
    public Invocation(Object target, Method method, Object[] args) {
        this.target = target;
        this.method = method;
        this.args = args;
    }

    /**
     * 获取目标对象
     *
     * @return 目标对象
     */
    public Object getTarget() {
        return target;
    }

    /**
     * 获取要调用的方法对象
     *
     * @return 方法对象
     */
    public Method getMethod() {
        return method;
    }

    /**
     * 获取方法参数列表
     *
     * @return 参数数组
     */
    public Object[] getArgs() {
        return args;
    }

    /**
     * 执行方法调用
     *
     * @return 方法调用的返回值
     * @throws InvocationTargetException 如果方法内部抛出异常
     * @throws IllegalAccessException    如果没有权限访问方法
     */
    public Object proceed() throws InvocationTargetException, IllegalAccessException {
        // 使用反射机制调用方法，传入目标对象和参数
        return method.invoke(target, args);
    }

}
